import type { MessageArgsProps } from 'ant-design-vue';

import type { ErrorMessageMode } from '#/request';

import { h } from 'vue';

import { SessionTimeoutProcessingEnum } from '@/enums/appEnum';
import { useI18n } from '@/hooks/web/useI18n';
import { useMessage } from '@/hooks/web/useMessage';
import projectSetting from '@/settings/projectSetting';
import { useIdentityStoreWithOut } from '@/store/modules/identity';

const { createMessage, createErrorModal } = useMessage();
const error = createMessage.error!;
const stp = projectSetting.sessionTimeoutProcessing;

/**
 * 审核状态
 * @param statusCode 状态码
 * @param msg 状态消息
 * @param errorMessageMode 错误消息提示模式
 * @param icUnauthorized 启用401拦截
 */
export async function checkStatus(
  statusCode: number,
  msg: string,
  errorMessageMode: ErrorMessageMode = 'message',
  icUnauthorized: boolean = true,
) {
  const { t } = useI18n();
  const identityStore = useIdentityStoreWithOut();
  let errMessage = '';
  const msgString = msg !== undefined && msg !== null && msg !== '' ? ` ${msg}` : '';
  if (!statusCode) {
    errMessage = msgString;
  }
  const statusMsg = `${statusCode ? `${statusCode} - ${getStatusLable(statusCode)}` : ''}${msgString}`;
  if (!(statusCode < 400)) {
    errMessage = statusMsg;
  }
  // 401: Not logged in
  if (icUnauthorized && statusCode === 401) {
    if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) {
      identityStore.setSessionTimeout(true);
    } else {
      await identityStore.logout(false);
    }
  }

  // errorMessageMode='modal'的时候会显示modal错误弹窗，而不是消息提示，用于一些比较重要的错误
  // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示
  if (errMessage) {
    if (errorMessageMode === 'modal') {
      createErrorModal({
        zIndex: 999999999,
        title: () => h('span', t('sys.api.errorTip')),
        content: () => h('span', errMessage),
      });
    } else if (errorMessageMode === 'message') {
      const messageProps: MessageArgsProps = {
        content: errMessage,
        duration: undefined,
        type: 'error',
        // prefixCls?: null,
        // rootPrefixCls?: null,
        // onClose?: () => {},
        // icon?: null,
        key: `global_error_message_status_${statusCode}`,
        // style?: null,
        // class?: null,
        // appContext?: null,
      };
      error(messageProps);
    }
  }
}

/**
 * 获取状态标签
 * @param statusCode 状态码
 */
export function getStatusLable(statusCode: number) {
  const { t } = useI18n();
  let statusMsg = '';
  if (!statusCode) {
    return statusMsg;
  }
  switch (statusCode) {
    case 100:
      statusMsg = `${t('sys.api.msg100')}`;
      break;
    case 101:
      statusMsg = `${t('sys.api.msg101')}`;
      break;
    case 102:
      statusMsg = `${t('sys.api.msg102')}`;
      break;
    case 200:
      statusMsg = `${t('sys.api.msg200')}`;
      break;
    case 201:
      statusMsg = `${t('sys.api.msg201')}`;
      break;
    case 202:
      statusMsg = `${t('sys.api.msg202')}`;
      break;
    case 203:
      statusMsg = `${t('sys.api.msg203')}`;
      break;
    case 204:
      statusMsg = `${t('sys.api.msg204')}`;
      break;
    case 205:
      statusMsg = `${t('sys.api.msg205')}`;
      break;
    case 206:
      statusMsg = `${t('sys.api.msg206')}`;
      break;
    case 207:
      statusMsg = `${t('sys.api.msg207')}`;
      break;
    case 300:
      statusMsg = `${t('sys.api.msg300')}`;
      break;
    case 301:
      statusMsg = `${t('sys.api.msg301')}`;
      break;
    case 302:
      statusMsg = `${t('sys.api.msg302')}`;
      break;
    case 303:
      statusMsg = `${t('sys.api.msg303')}`;
      break;
    case 304:
      statusMsg = `${t('sys.api.msg304')}`;
      break;
    case 305:
      statusMsg = `${t('sys.api.msg305')}`;
      break;
    case 306:
      statusMsg = `${t('sys.api.msg306')}`;
      break;
    case 307:
      statusMsg = `${t('sys.api.msg307')}`;
      break;
    case 400:
      statusMsg = `${t('sys.api.msg400')}`;
      break;
    case 401:
      statusMsg = `${t('sys.api.msg401')}`;
      break;
    case 403:
      statusMsg = `${t('sys.api.msg403')}`;
      break;
    case 404:
      statusMsg = `${t('sys.api.msg404')}`;
      break;
    case 405:
      statusMsg = `${t('sys.api.msg405')}`;
      break;
    case 406:
      statusMsg = `${t('sys.api.msg406')}`;
      break;
    case 407:
      statusMsg = `${t('sys.api.msg407')}`;
      break;
    case 408:
      statusMsg = `${t('sys.api.msg408')}`;
      break;
    case 409:
      statusMsg = `${t('sys.api.msg409')}`;
      break;
    case 410:
      statusMsg = `${t('sys.api.msg410')}`;
      break;
    case 411:
      statusMsg = `${t('sys.api.msg411')}`;
      break;
    case 412:
      statusMsg = `${t('sys.api.msg412')}`;
      break;
    case 413:
      statusMsg = `${t('sys.api.msg413')}`;
      break;
    case 414:
      statusMsg = `${t('sys.api.msg414')}`;
      break;
    case 415:
      statusMsg = `${t('sys.api.msg415')}`;
      break;
    case 416:
      statusMsg = `${t('sys.api.msg416')}`;
      break;
    case 417:
      statusMsg = `${t('sys.api.msg417')}`;
      break;
    case 418:
      statusMsg = `${t('sys.api.msg418')}`;
      break;
    case 421:
      statusMsg = `${t('sys.api.msg421')}`;
      break;
    case 422:
      statusMsg = `${t('sys.api.msg422')}`;
      break;
    case 423:
      statusMsg = `${t('sys.api.msg423')}`;
      break;
    case 424:
      statusMsg = `${t('sys.api.msg424')}`;
      break;
    case 425:
      statusMsg = `${t('sys.api.msg425')}`;
      break;
    case 426:
      statusMsg = `${t('sys.api.msg426')}`;
      break;
    case 428:
      statusMsg = `${t('sys.api.msg428')}`;
      break;
    case 429:
      statusMsg = `${t('sys.api.msg429')}`;
      break;
    case 431:
      statusMsg = `${t('sys.api.msg431')}`;
      break;
    case 449:
      statusMsg = `${t('sys.api.msg449')}`;
      break;
    case 451:
      statusMsg = `${t('sys.api.msg451')}`;
      break;
    case 500:
      statusMsg = `${t('sys.api.msg500')}`;
      break;
    case 501:
      statusMsg = `${t('sys.api.msg501')}`;
      break;
    case 502:
      statusMsg = `${t('sys.api.msg502')}`;
      break;
    case 503:
      statusMsg = `${t('sys.api.msg503')}`;
      break;
    case 504:
      statusMsg = `${t('sys.api.msg504')}`;
      break;
    case 505:
      statusMsg = `${t('sys.api.msg505')}`;
      break;
    case 506:
      statusMsg = `${t('sys.api.msg506')}`;
      break;
    case 507:
      statusMsg = `${t('sys.api.msg507')}`;
      break;
    case 509:
      statusMsg = `${t('sys.api.msg509')}`;
      break;
    case 510:
      statusMsg = `${t('sys.api.msg510')}`;
      break;
    case 511:
      statusMsg = `${t('sys.api.msg511')}`;
      break;
    default:
      statusMsg = `${t('sys.api.requestError')}`;
      break;
  }
  return statusMsg;
}
